iT邦幫忙

2019 iT 邦幫忙鐵人賽

DAY 30
1

2023.01 最新內容已更新於 BLOG


Eric: 接著,我們單獨討論 Jenkins 與 Docker 的串接方式

吉米: OK。


Jenkins_pipeline

如果曾經使用 Jenkins 進行發佈,或許對 pipeline 並不陌生。

在 Pipeline 中,Jenkins 會依據 jenkinsfile 內容的指示執行各種動作。運用 Groovy 的格式來撰寫 jenkinsfile 讓使用者可以客制化建置的流程與環境。

經由 jenkinsfile 與 docker 的配合,我們可以自行訂定各 階段 (stages) ,使用不同 Docker Image 建置環境,執行不同的動作。而無需手動配置環境。

下面的範例,在 測試階段,調用 node,js 的 docker image 做為執行環境,然後執行 node.js 的相關動作。

Jenkinsfile (Declarative Pipeline)

pipeline {
    agent {
        docker { image 'node:7-alpine' }
    }
    stages {
        stage('Test') {
            steps {
                sh 'node --version'
            }
        }
    }
}

1. dockerfile

Pipeline 支援運用 dockerfile,進行 docker image 的建立與執行。

當我們將 jenkinsfile 中,使用 agent { dockerfile true } ,Pipeline 就會使用 Repository 根目錄下的 dockerfile ,進行 docker image 的建立與執行。

pipeline {
    agent { dockerfile true }
    stages {
        stage('Test') {
            steps {
                sh 'node --version'
                sh 'svn --version'
            }
        }
    }
}

此外,也可以在 agent 內直接下 docker 指令。

agent {
    docker {
        image 'myregistry.com/node'
        label 'my-defined-label'
        registryUrl 'https://myregistry.com/'
        registryCredentialsId 'myPredefinedCredentialsInJenkins'
    }
}

或是在 agent 內寫 dockerfile 的內容。

agent {
    // Equivalent to "docker build -f Dockerfile.build --build-arg version=1.0.2 ./build/
    dockerfile {
        filename 'Dockerfile.build'
        dir 'build'
        label 'my-defined-label'
        additionalBuildArgs  '--build-arg version=1.0.2'
        args '-v /tmp:/tmp'
    }
}

關於 Pipeline 中,agent 部份的其他語法,如果有興趣,可以參考官方文件

2. docker-compose

雖然 Jenkins 的官方文件中,沒有特別說明到 docker-compose 的部份。但筆者很幸運找到 Symfony 在 Jenkins 運用 docker-compose 的文章 ( A continuous integration pipeline with Jenkins in Docker )。

下面,筆者擷取部份 jenkinsfile 的內文。

pipeline {
    agent { label 'docker' }
    triggers {
        bitbucketPush()
    }
    environment {
        // Specify your environment variables.
        APP_VERSION = '1'
    }
    stages {
        stage('Build') {
            steps {
                // Print all the environment variables.
                sh 'printenv'
                sh 'echo $GIT_BRANCH'
                sh 'echo $GIT_COMMIT'
                echo 'Install non-dev composer packages and test a symfony cache clear'
                sh 'docker-compose -f build.yml up --exit-code-from fpm_build --remove-orphans fpm_build'
                echo 'Building the docker images with the current git commit'
                sh 'docker build -f Dockerfile-php-production -t registry.example.com/symfony_project_fpm:$GIT_COMMIT .'
                sh 'docker build -f Dockerfile-nginx -t registry.example.com/symfony_project_nginx:$GIT_COMMIT .'
                sh 'docker build -f Dockerfile-db -t registry.example.com/symfony_project_db:$GIT_COMMIT .'
            }
        }
    }
}

從範例中,可以看到 docker-compose 的使用點,是 位於 steps 內,以 命令列 的方式執行。不像 dockerfile ,Jenkins 有直接的支援。

筆者將其再次精減,可以很清楚的看到 docker-compose 的使用方式。

pipeline {
    agent { label 'docker' }
    stages {
        steps {
            sh 'docker-compose -f build.yml up --exit-code-from fpm_build --remove-orphans fpm_build'
        }
    }
}

最後,該篇文章也分享它們執行 jenkinsfile 的畫面。

從圖中,真的可以發現 Symfony 活用 Jenkins Pipeline 功能,建立起 建置、測試、發佈 一連串自動化 CI/CD 流程。

Jenkins pipeline

(圖片來源: A continuous integration pipeline with Jenkins in Docker)


吉米: 哇,每個 CI Server 的設定方式,設定的方式都不太相同。

Eric: 是啊。不過,再怎麼變化,都是離不開 docker 的指令、 dockerfiledocker-compose.yml 這三個部份。

吉米: 嗯嗯,還要多試幾次,才能把 docker 摸的比較了解。

Eric: 一起加油吧。

<< 完 >>


延伸閱讀

  1. Gustavo Apolinario, Jenkins Building Docker Image and Sending to Registry
  2. Jenkins Document, Using Docker with Pipeline
  3. Miiro Juuso, Building your first Docker image with Jenkins 2: Guide for developers
  4. nielsvandermolen, A continuous integration pipeline with Jenkins in Docker
  5. 持续集成之 Jenkins 通过 Deploy 插件热部署 java 程序(九)

上一篇
29. Docker 與 CI/CD (上)
系列文
從零開始建立自動化發佈的流水線30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

2 則留言

1
Daniel Wu
iT邦新手 4 級 ‧ 2018-11-14 17:06:44

恭喜大大完賽/images/emoticon/emoticon42.gif

伊恩 iT邦新手 4 級 ‧ 2018-11-14 22:54:15 檢舉

謝謝, 不過還有一些內容要補上

1
cwchiu
iT邦新手 3 級 ‧ 2019-05-13 11:35:46

系列好文 獲益良多

我要留言

立即登入留言